Lazy Loading例子
1 | class MyHome extends StatefulWidget { |
1 | bool _handleScrollNotification(ScrollNotification notification) { |
同样摘自上面的链接,里面还有个有意思的组件,也可以用来Lazy Loading
1 | List<List<String>> lists = [["A1","A2","A3","A4","A5"],["B1","B2","B3"],["C1","C2","C3","C4","C5"],["D1","D2","D3"]]; |
这个要使用者点击按钮来加载数据,也很有意思。
How to load multiple list view inside single list view?
突然想到google教程里的一个例子,这个例子比较特殊,没有用到setState
1 | class _RandomWordsState extends State<RandomWords> { |
毕设相关的话:
为啥要改成Lazy Loading呢?本来都不打算搞这玩意儿的,但是Algolia API限制每次query返回的结果数,这使得我不得不重写代码。(API 有hitsPerPage【returns the maximum number of hits returned for each page】这玩意儿我还是在代码报错后才发现的,在查出错误原因前我还一直纠缠于TextField的焦点与ListView的焦点问题,以为是listview的bug,昨晚睡前debug才发现listview报的RangeError (index): Invalid value: Not in inclusive range 0..19: 20
是真的超了,algolia返回匹配结果数是21,每次默认只传20个……以后还是得认真看看API文档)
下面,贴文档:
第二个链接里有js的lazy loading写法,可以借鉴:
1 | let lastRenderArgs; |
SearchDelegate相关
因为SearchDelegate默认不支持State,上面代码中设置了itemCount的ListView所用的SetState显然不能直接塞进我们的代码中,这里有两种解决方法:
1. 改flutter search.dart源码
Allow search page to maintain state when navigating to a new route.#45263
这个PR本来打算直接使SearchDelegate支持State,可惜的是提交PR的人后来改主意了,真是可惜,不过我们还是可以自己改源码来实现该功能
2. StatefulBuilder,自己建立状态子树
how to use setState in SearchDelegate
1 | class DataSearch extends SearchDelegate<String> { |
其他知识
滚动监听
ScrollController
间接继承自Listenable
,我们可以根据ScrollController
来监听滚动事件,如:
1 | controller.addListener(()=>print(controller.offset)) |